package com.zishuimuyu.http;

import org.apache.http.NameValuePair;
import org.apache.http.client.config.CookieSpecs;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.message.BasicNameValuePair;

import java.util.ArrayList;
import java.util.List;

/**
 * 该类继承自 AbstractHttpParams，用于处理 HTTP POST 请求的参数
 */
public class HttpPostParams extends AbstractHttpParams {
    /**
     * 重写父类的 send 方法，用于发送 HTTP POST 请求
     *
     * @param httpClient 可关闭的 HTTP 客户端，用于执行 HTTP 请求
     * @param base       请求的基础 URL
     * @return 包含响应信息的 CloseableHttpResponse 对象
     * @throws Exception 如果在构建请求参数、设置请求配置或执行请求过程中发生异常
     */
    @Override
    protected CloseableHttpResponse send(CloseableHttpClient httpClient, String base) throws Exception {
        // 创建一个存储 NameValuePair 的列表，用于存储请求参数
        List<NameValuePair> formparams = new ArrayList<NameValuePair>();
        // 遍历存储参数的 Map
        for (String key : params.keySet()) {
            // 获取当前键对应的值
            String value = params.get(key);
            // 将键值对封装成 BasicNameValuePair 对象并添加到列表中
            formparams.add(new BasicNameValuePair(key, value));
        }
        // 创建一个 HttpPost 请求对象，使用传入的基础 URL
        HttpPost request = new HttpPost(base);

        // 创建一个 RequestConfig 对象，设置 Cookie 规范为标准规范
        RequestConfig localConfig = RequestConfig.custom()
                .setCookieSpec(CookieSpecs.STANDARD)
                .build();
        // 将 RequestConfig 对象设置到请求中
        request.setConfig(localConfig);
        // 创建一个 UrlEncodedFormEntity 对象，将参数列表编码为表单实体，并设置字符编码为 UTF-8
        request.setEntity(new UrlEncodedFormEntity(formparams, "UTF-8"));
        // 设置请求头，指定请求内容类型为 application/x-www-form-urlencoded
        request.setHeader("Content-Type", "application/x-www-form-urlencoded");
        // 使用传入的 HTTP 客户端执行请求，并返回响应
        return httpClient.execute(request);
    }
}
